package com.cdz.charger.service.impl;

import java.util.List;

import com.cdz.charger.vo.ChargerTypesVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.cdz.charger.mapper.ChargerTypesMapper;
import com.cdz.charger.domain.ChargerTypes;
import com.cdz.charger.service.IChargerTypesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.Arrays;

/**
 * 充电桩类型Service业务层处理
 *
 * @author baefengk2
 * @date 2025-03-06
 */
@Service
@Slf4j
public class ChargerTypesServiceImpl extends ServiceImpl<ChargerTypesMapper, ChargerTypes> implements IChargerTypesService {
    @Autowired
    private ChargerTypesMapper chargerTypesMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    public static final String REDIS_CACHE_TYPE_ALL_KEY = "charger:chargerType:all";

    /**
     * 查询充电桩类型
     *
     * @param id 充电桩类型主键
     * @return 充电桩类型
     */
    @Override
    public ChargerTypes selectChargerTypesById(Long id) {
        return getById(id);
    }

    /**
     * 查询充电桩类型列表
     *
     * @param chargerTypes 充电桩类型
     * @return 充电桩类型
     */
    @Override
    public List<ChargerTypes> selectChargerTypesList(ChargerTypes chargerTypes) {
        return chargerTypesMapper.selectChargerTypesList(chargerTypes);
    }

    /**
     * 新增充电桩类型
     *
     * @param chargerTypes 充电桩类型
     * @return 结果
     */
    @Override
    public int insertChargerTypes(ChargerTypes chargerTypes) {

        int result = save(chargerTypes) ? 1 : 0;

        if (result == 1) {
            // 1.从缓存中删除数据
            redisTemplate.delete(REDIS_CACHE_TYPE_ALL_KEY);
        }

        return result;
    }

    /**
     * 修改充电桩类型
     *
     * @param chargerTypes 充电桩类型
     * @return 结果
     */
    @Override
    public int updateChargerTypes(ChargerTypes chargerTypes) {

        int result = updateById(chargerTypes) ? 1 : 0;

        if (result == 1) {
            // 1.从缓存中删除数据
            redisTemplate.delete(REDIS_CACHE_TYPE_ALL_KEY);
        }

        return result;
    }

    /**
     * 批量删除充电桩类型
     *
     * @param ids 需要删除的充电桩类型主键
     * @return 结果
     */
    @Override
    public int deleteChargerTypesByIds(Long[] ids) {

        int result = removeByIds(Arrays.asList(ids)) ? 1 : 0;

        if (result == 1) {
            // 1.从缓存中删除数据
            redisTemplate.delete(REDIS_CACHE_TYPE_ALL_KEY);
        }
        return result;
    }

    /**
     * 删除充电桩类型信息
     *
     * @param id 充电桩类型主键
     * @return 结果
     */
    @Override
    public int deleteChargerTypesById(Long id) {
        int result = removeById(id) ? 1 : 0;
        if (result == 1) {
            // 1.从缓存中删除数据
            redisTemplate.delete(REDIS_CACHE_TYPE_ALL_KEY);
        }
        return result;
    }

    /**
     * 获取所有充电桩类型
     *
     * TODO 优化：缓存中存储chargerTypesVo对象，减少数据库查询次数
     * @return
     */
    @Override
    public List<ChargerTypesVo> getAllChargerTypes() {
        // 1.从缓存中获取数据
        List<ChargerTypesVo> list = (List<ChargerTypesVo>) redisTemplate.opsForValue().get(REDIS_CACHE_TYPE_ALL_KEY);
        // 2.如果缓存中有数据，则直接返回数据
        if (ObjectUtils.isNotEmpty(list)) {
            log.info("-----------[Redis]------------缓存命中, 从缓存中获取数据");
            return list;
        }

        // 3.如果缓存中没有数据，则查询数据库
        list = chargerTypesMapper.getAllChargerTypes();

        // 4.将查询到的数据添加到缓存中
        redisTemplate.opsForValue().set(REDIS_CACHE_TYPE_ALL_KEY, list);

        log.info("-----------[MySQL]------------缓存未命中, 从数据库中获取数据");

        return list;
    }
}
